<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="urP6Q" id="urP6Q"><span data-lake-id="u41c570ed" id="u41c570ed">典型回答</span></h1>
  <p data-lake-id="u016dd3ce" id="u016dd3ce"><br></p>
  <p data-lake-id="ua4bc492c" id="ua4bc492c"><span data-lake-id="u161ba4a0" id="u161ba4a0">在电商场景中，创建了一个支付单之后，会通过支付工具进行支付，比如微信支付、支付宝、银行卡等，那么在特殊场景中，会出现，用户先通过微信支付尝试支付，因为网络延迟导致一直未支付成功，后面用户又再用支付宝支付成功了，可是过了一会，微信支付那面又回调通知支付成功了，这种该怎么处理呢？</span></p>
  <p data-lake-id="ube388b6e" id="ube388b6e"><span data-lake-id="uee59b8b0" id="uee59b8b0">​</span><br></p>
  <p data-lake-id="ub7284fb5" id="ub7284fb5"><span data-lake-id="u62391065" id="u62391065">其实，这个问题和之前我们讨论的另一个问题的解决思路差不多，但是也有一定的差别。</span></p>
  <p data-lake-id="u35de1a0d" id="u35de1a0d"><span data-lake-id="ua2ea3111" id="ua2ea3111">​</span><br></p>
  <p data-lake-id="u0de362ed" id="u0de362ed"><br></p>
  <p data-lake-id="ufce913b3" id="ufce913b3"><span data-lake-id="u381928d1" id="u381928d1">要想解决这个问题，首先需要有明确的状态机和支付单状态的流转控制，这个不详细展开了，可以参考上面这个文章。</span></p>
  <p data-lake-id="u449b76c0" id="u449b76c0"><span data-lake-id="u004b123f" id="u004b123f">​</span><br></p>
  <p data-lake-id="u20d1515e" id="u20d1515e"><span data-lake-id="u35392043" id="u35392043">这个场景存在一个特殊的地方，那就是已经支付成功的单据，下一次支付成功的回调过来的时候，如何做幂等控制。</span></p>
  <p data-lake-id="uc2a297d7" id="uc2a297d7"><span data-lake-id="u160b61c5" id="u160b61c5">​</span><br></p>
  <p data-lake-id="u079da243" id="u079da243"><span data-lake-id="u351800ca" id="u351800ca">好的做法是，在支付单中冗余一个支付渠道和渠道支付单号，在支付成功的时候，把支付渠道返回的渠道支付单号记录下来。</span></p>
  <p data-lake-id="uf7ba5cae" id="uf7ba5cae"><span data-lake-id="uc85feab1" id="uc85feab1">​</span><br></p>
  <p data-lake-id="u87f41a6f" id="u87f41a6f"><span data-lake-id="u9308c093" id="u9308c093">在接收到支付成功回调的时候，先检查状态，如果发现已经支付成功，则比对支付渠道和渠道单号是否一致，如果一致，则幂等成功。如果不一致，说明发生了重复支付，则执行退款流程。</span></p>
  <p data-lake-id="u46a703bf" id="u46a703bf"><span data-lake-id="u6bee983e" id="u6bee983e">​</span><br></p>
  <p data-lake-id="ua8d4a845" id="ua8d4a845"><span data-lake-id="uff3fc0cd" id="uff3fc0cd">​</span><br></p>
  <p data-lake-id="u42e671e6" id="u42e671e6"><span data-lake-id="u763b76cf" id="u763b76cf">冲退的流程及异常情况处理，在上面的链接中也展开讲过，这里不再赘述了。</span></p>
 </body>
</html>